package com.now.doublepointer;

/**
 * 557. 反转字符串中的单词 III
 * 给定一个字符串，你需要反转字符串中每个单词的字符顺序，同时仍保留空格和单词的初始顺序。
 */
public class ReverseWords {
    /**
     * 执行结果：
     * 通过
     *
     * 执行用时：
     * 5 ms, 在所有 Java 提交中击败了68.66%的用户
     * 内存消耗：
     * 39.1 MB, 在所有 Java 提交中击败了41.33%的用户
     * @param s
     * @return
     */
    public static String reverseWords(String s) {
        char[] res = s.toCharArray();
        int start = 0;
        int end = 0;
        while(end<=s.length()-1){
            if(' '== res[end] ){
                reverseString(res,start,end-1);
                start = end+1;
            }else if(end == s.length()-1){
                reverseString(res,start,end);
            }
            end++;
        }
        return String.valueOf(res);
    }
    public static void reverseString(char[] chars,int start,int end) {
        while(start<=end){
            char data = chars[start];
            chars[start]=chars[end];
            chars[end]=data;
            start++;
            end--;
        }
    }

    /**
     * 官方解答
     * 执行结果：
     * 通过
     *
     * 执行用时：
     * 7 ms, 在所有 Java 提交中击败了38.35%的用户
     * 内存消耗：
     * 38.8 MB, 在所有 Java 提交中击败了88.52%的用户
     * @param s
     * @return
     */
    public static String reverseWords2(String s) {
        StringBuffer ret = new StringBuffer();
        int length = s.length();
        int i = 0;
        while (i < length) {
            int start = i;
            while (i < length && s.charAt(i) != ' ') {
                i++;
            }
            for (int p = start; p < i; p++) {
                ret.append(s.charAt(start + i - 1 - p));
            }
            while (i < length && s.charAt(i) == ' ') {
                i++;
                ret.append(' ');
            }
        }
        return ret.toString();
    }


    public static void main(String[] args) {
        String s = " Let's take LeetCode contest ";
        System.out.println(reverseWords(s));
        System.out.println(reverseWords2(s));
    }
}
